﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using BLL.BusinessClasses;

namespace WebSite.Empresa
{
    public partial class Vacantes : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.Session["UsuarioDeSesion"] == null || !(this.Session["UsuarioDeSesion"] is UsuarioEmpresa))
            {
                this.Response.Redirect(@"~/General/Principal.aspx");
            }
            if (!(this.Page.IsPostBack))
            {
                this.DarBienvenida();
            }
        }

        protected void Button_LogOff_Click(object sender, EventArgs e)
        {
            this.Session["UsuarioDeSesion"] = null;
            this.Response.Redirect("../General/Principal.aspx");
        }
        private void DarBienvenida()
        {
            ((Label)(this.Master.FindControl("Label_Bienvenida"))).Text = "Bienvenido <u>" +
                                                                          ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Nombre +
                                                                          "</u>";
        }

        protected void Esconder_ContenidoPagina()
        {
            if (this.Panel_VacantesActivas.Visible)
            {
                this.Button_MostrarPanelVacantesActivas.Text = "▼";
                this.Panel_VacantesActivas.Visible = false;
            }

            if (this.Panel_VacantesCerradas.Visible)
            {
                this.Button_MostrarPanelVacantesCerradas.Text = "▼";
                this.Panel_VacantesCerradas.Visible = false;
            }

            if (this.Panel_NuevaVacante.Visible)
            {
                this.Panel_NuevaVacante.Visible = false;
                this.Button_MostrarPanelNuevaVacante.Text = "▼";
            }

            if (this.Panel_DatosVacante.Visible)
            {
                this.Panel_DatosVacante.Visible = false;
            }
        }

        //Show/Hide Event Handlers
        protected void Button_MostrarPanelVacantesActivas_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_VacantesActivas.Visible = !(this.Panel_VacantesActivas.Visible);
            this.GridView_VacantesActivas.SelectedIndex = -1;

            if (this.Panel_VacantesActivas.Visible)
            {
                this.Button_MostrarPanelVacantesActivas.Text = "▲";
                this.PoblarGridView_VacantesActivas();
            }
            else this.Button_MostrarPanelVacantesActivas.Text = "▼";
        }
        protected void Button_MostrarPanelVacantesCerradas_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_VacantesCerradas.Visible = !(this.Panel_VacantesCerradas.Visible);
            this.GridView_VacantesCerradas.SelectedIndex = -1;

            if (this.Panel_VacantesCerradas.Visible) 
            { 
                this.Button_MostrarPanelVacantesCerradas.Text = "▲";
                this.PoblarGridView_VacantesCerradas();
            }
            else this.Button_MostrarPanelVacantesCerradas.Text = "▼";
        }
        protected void Button_MostrarPanelNuevaVacante_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_NuevaVacante.Visible = !(this.Panel_NuevaVacante.Visible);

            if (this.Panel_NuevaVacante.Visible) 
            {
                this.Button_MostrarPanelNuevaVacante.Text = "▲"; 
            }
            else this.Button_MostrarPanelNuevaVacante.Text = "▼";
        }

        //Poblar Campos Methods
        private void PoblarGridView_VacantesActivas()
        {
            var VacantesSource = from v in ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Vacantes
                                 where v.SiActiva == true
                                 select new
                                 {
                                     ID = v.ID,
                                     Descripcion = v.Descripcion,
                                     FechaPublicacion = v.FechaPublicacion,
                                     FechaCierre = v.FechaCierre,
                                     Carrera = v.Carrera.Descripcion,
                                     Empresa = v.Publicante.Nombre,
                                     Puesto = v.Puesto
                                 };

            this.GridView_VacantesActivas.DataSource = VacantesSource;
            this.GridView_VacantesActivas.DataBind();
        }
        private void PoblarGridView_VacantesCerradas()
        {
            var VacantesSource = from v in ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Vacantes
                                 where v.SiActiva == false                                 
                                 select new
                                 {
                                     ID = v.ID,
                                     Descripcion = v.Descripcion,
                                     FechaPublicacion = v.FechaPublicacion,
                                     Carrera = v.Carrera.Descripcion,
                                     Empresa = v.Publicante.Nombre,
                                     Puesto = v.Puesto,
                                     FechaCierre = v.FechaCierre
                                 };

            this.GridView_VacantesCerradas.DataSource = VacantesSource;
            this.GridView_VacantesCerradas.DataBind();
        }

        //Button Click Event Handlers
        protected void Button_CerrarVacante_Click(object sender, EventArgs e)
        {
            try
            {
                ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).DesactivarVacante(Convert.ToInt32(this.GridView_VacantesActivas.SelectedValue));

                this.GridView_VacantesActivas.SelectedIndex = -1;
                this.PoblarGridView_VacantesActivas();

                if (this.Panel_VacantesCerradas.Visible) 
                {
                    this.PoblarGridView_VacantesCerradas();
                }
            }
            catch (Exception)
            {
                this.Label_MensajeErrorCerrarVacante.Visible = true;
            }
        }
        protected void Button_ReabrirVacante_Click(object sender, EventArgs e)
        {            
            try
            {
                ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).ActivarVacante(Convert.ToInt32(this.GridView_VacantesCerradas.SelectedValue));

                this.GridView_VacantesCerradas.SelectedIndex = -1;
                this.PoblarGridView_VacantesCerradas();

                if (this.GridView_VacantesActivas.Visible)
                {
                    this.PoblarGridView_VacantesActivas();
                }
            }
            catch (Exception)
            {
                this.Label_MensajeErrorReabrirVacante.Visible = true;
            }
        }
        protected void Button_EliminarHabilidad_Click(object sender, EventArgs e)
        {
            if (this.ListBox_HabilidadesVacanteNueva.SelectedIndex != -1)
            {
                this.ListBox_HabilidadesVacanteNueva.Items.RemoveAt(this.ListBox_HabilidadesVacanteNueva.SelectedIndex);
            }

            //try
            //{
            //    if (this.DropDownList_HabilidadesVacanteNueva.SelectedIndex != 0 ||
            //        DropDownList_HabilidadesVacanteNueva.SelectedIndex != -1)
            //    {
            //        Habilidad ToRemove = new Habilidad(Int32.Parse(DropDownList_HabilidadesVacanteNueva.SelectedValue));
            //        List<Habilidad> HabilidadesVacante = (List<Habilidad>)ViewState["Habilidades"];

            //        HabilidadesVacante.Remove(ToRemove);

            //        DropDownList_HabilidadesVacanteNueva.DataSource = HabilidadesVacante;
            //        DropDownList_HabilidadesVacanteNueva.DataBind();

            //        ViewState["Habilidades"] = HabilidadesVacante;
            //        PoblarTextBox_HabilidadesRequeridasVacanteNueva();
            //    }
            //}
            //catch (Exception)
            //{
            //    //this.labelLabel_MensajeErrorHabilidadEliminar.Visible = true;
            //}
            //finally
            //{
            //    Button_EliminarHabilidad.Enabled = false;
            //}
        }
        protected void Button_AñadirHabilidad_Click(object sender, EventArgs e)
        {
            if (this.DropDownList_HabilidadesVacanteNueva.SelectedValue != "0")
            {
                ListItem ItemToAdd = new ListItem(this.DropDownList_HabilidadesVacanteNueva.SelectedItem.Text,
                                                  this.DropDownList_HabilidadesVacanteNueva.SelectedItem.Value);

                if (!(ListBox_HabilidadesVacanteNueva.Items.Contains(ItemToAdd)))
                {
                    this.ListBox_HabilidadesVacanteNueva.Items.Add(ItemToAdd);
                }
                else
                {
                    this.Label_MensajeErrorHabilidadExistente.Visible = true;
                }
            }

            //try
            //{
            //    if (this.DropDownList_HabilidadesVacanteNueva.SelectedIndex != 0)
            //    {
            //        List<Habilidad> HabilidadesVacante = (List<Habilidad>)ViewState["Habilidades"];
            //        Habilidad ToAdd = new Habilidad(Int32.Parse(DropDownList_HabilidadesVacanteNueva.SelectedValue));

            //        if (!HabilidadesVacante.Contains(ToAdd))
            //        {
            //            HabilidadesVacante.Add(ToAdd);
            //            ViewState["Habilidades"] = HabilidadesVacante;

            //            DropDownList_HabilidadesVacanteNueva.DataSource = HabilidadesVacante;
            //            DropDownList_HabilidadesVacanteNueva.DataBind();
            //            PoblarTextBox_HabilidadesRequeridasVacanteNueva();
            //        }
            //        else
            //        {
            //            Label_MensajeErrorHabilidadExistente.Visible = true;
            //        }
            //    }
            //}
            //catch (Exception)
            //{
            //    Label_MensajeErrorNuevaHabilidad.Enabled = true;
            //}
        }
        protected void Button_NuevaHabilidadVacanteNueva_Click(object sender, EventArgs e)
        {
            try
            {
                Habilidad.CrearHabilidad(this.TextBox_NuevaHabilidadVacanteNueva.Text.Trim());
                this.TextBox_NuevaHabilidadVacanteNueva.Text = String.Empty;

                this.DropDownList_HabilidadesVacanteNueva.Items.Clear();
                this.DropDownList_HabilidadesVacanteNueva.Items.Add(new ListItem("[Seleccione una habilidad]", "0"));
                this.DropDownList_HabilidadesVacanteNueva.DataBind();
            }
            catch
            {
                Label_MensajeErrorNuevaHabilidad.Visible = true;
            }
        }
        protected void Button_EliminarPostgradoVacanteNueva_Click(object sender, EventArgs e)
        {
            if (this.ListBox_PostgradosVacanteNueva.SelectedIndex != -1)
            {
                this.ListBox_PostgradosVacanteNueva.Items.RemoveAt(this.ListBox_PostgradosVacanteNueva.SelectedIndex);
            }
        }
        protected void Button_AñadirPostgradoVacanteNueva_Click(object sender, EventArgs e)
        {
            if (this.DropDownList_PostgradosVacanteNueva.SelectedValue != "0")
            {
                ListItem ItemToAdd = new ListItem(this.DropDownList_PostgradosVacanteNueva.SelectedItem.Text,
                                                  this.DropDownList_PostgradosVacanteNueva.SelectedItem.Value);

                if (!(this.ListBox_PostgradosVacanteNueva.Items.Contains(ItemToAdd)))
                {
                    this.ListBox_PostgradosVacanteNueva.Items.Add(ItemToAdd);
                }
                else
                {
                    this.Label_MensajeErrorPostgradoExistente.Visible = true;
                }
            }
        }
        protected void Button_PublicarVacante_Click(object sender, EventArgs e)
        {
            /*this.TextBox_PuestoVacanteNueva.Text.Trim() != String.Empty &&*/
            if (this.TextBox_DescripcionVacanteNueva.Text.Trim() != String.Empty &&
                this.DropDownList_CarrerasVacanteNueva.SelectedValue != "0" &&
                this.DropDownList_PaisesVacanteNueva.SelectedValue != "0")
            {
                try
                {
                    Vacante NuevaVacante = new Vacante();

                    NuevaVacante.Puesto = this.TextBox_PuestoVacanteNueva.Text.Trim();
                    NuevaVacante.Carrera = new Carrera(Convert.ToInt32(this.DropDownList_CarrerasVacanteNueva.SelectedValue));
                    NuevaVacante.Descripcion = this.TextBox_DescripcionVacanteNueva.Text.Trim();
                    NuevaVacante.Pais = new Pais(Convert.ToInt32(this.DropDownList_PaisesVacanteNueva.SelectedValue));
                    NuevaVacante.FechaCierre = DateTime.Now.AddDays(Convert.ToInt32(ConfigurationSettings.AppSettings["TiempoDeVidaVacante"]));
                    NuevaVacante.Publicante = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia;

                    //Cargando las habilidades desde ListBox_HabilidadesVacanteNueva
                    if (this.ListBox_HabilidadesVacanteNueva.Items.Count != 0)
                    {
                        List<Habilidad> HabilidadesDeVacante = new List<Habilidad>();
                        foreach (ListItem Item in this.ListBox_HabilidadesVacanteNueva.Items)
                        {
                            HabilidadesDeVacante.Add(new Habilidad(Convert.ToInt32(Item.Value)));
                        }
                        NuevaVacante.Habilidades = HabilidadesDeVacante;
                    }

                    //Cargando los postgrados desde ListBox_PostgradosVacanteNueva
                    if (this.ListBox_PostgradosVacanteNueva.Items.Count != 0)
                    {
                        List<Postgrado> PostgradosDeVacante = new List<Postgrado>();
                        foreach (ListItem Item in this.ListBox_PostgradosVacanteNueva.Items)
                        {
                            PostgradosDeVacante.Add(new Postgrado(Convert.ToInt32(Item.Value)));
                        }
                        NuevaVacante.EstudiosRequeridos = PostgradosDeVacante;
                    }

                    NuevaVacante.Insertar();

                    // Comenzar el thread de mandar emails
                    System.Threading.Thread EmailSender = new System.Threading.Thread(EnviarEmails);
                    EmailSender.Start();

                    this.Label_NotificacionPublicacionVacante.Text = "La vacante ha sido publicada con exito";
                    this.Label_NotificacionPublicacionVacante.Visible = true;
                }
                catch (Exception) 
                {
                    this.Label_NotificacionPublicacionVacante.Text = "No se ha podido publicar la vacante. Intente luego";
                    this.Label_NotificacionPublicacionVacante.Visible = true;
                }
            }
            else 
            {
                this.Label_NotificacionPublicacionVacante.Text = "Los campos &quot;Carrera&quot;, <br />&quot;Descripcion&quot; y &quot;Pais&quot; son necesarios";
                this.Label_NotificacionPublicacionVacante.Visible = true;
            }
        }

        protected void EnviarEmails()
        {
            List<string> Recipients = new List<string>();

            foreach (UsuarioEgresado EgresadoToGetEMail in UsuarioEgresado.GetEgresadosByCarreraID(Convert.ToInt32(this.DropDownList_CarrerasVacanteNueva.SelectedValue))) 
            {
                var EMailEgresado = from c in EgresadoToGetEMail.Contactos
                                    where c.TipoContacto.Trim().ToLower() == "email"
                                    select c.Descripcion;

                Recipients.AddRange(EMailEgresado);                
            }
            foreach (UsuarioEstudiante EstudianteToGetEMail in UsuarioEstudiante.GetEstudiantesByCarreraID(Convert.ToInt32(this.DropDownList_CarrerasVacanteNueva.SelectedValue)))
            {
                var EMailEstudiante = from c in EstudianteToGetEMail.Contactos
                                      where c.TipoContacto.Trim().ToLower() == "email"
                                      select c.Descripcion;

                Recipients.AddRange(EMailEstudiante);
            }

            string Texto = new Documento("Publicacion de Vacante").Contenido + "<br />";

            BLL.BusinessClasses.Email.SendMail(Recipients, null, "Notificacion Publicacion de Vacante", Texto);
        }

        //Helper Methods
        protected void GridView_VacantesActivas_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.Button_CerrarVacante.Enabled = true;
            this.Panel_DatosVacante.Visible = true;
        }
        protected void GridView_VacantesCerradas_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.Button_ReabrirVacante.Enabled = true;
        }

        protected void GridView_DatosVacante_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (((string)DataBinder.Eval(e.Row.DataItem, "Empresa.Foto")) != null)
                {
                    ((Image)e.Row.FindControl("Image_LogoEmpresa")).ImageUrl = ((string)DataBinder.Eval(e.Row.DataItem, "Empresa.Foto"));
                }
                else
                {
                    ((Image)e.Row.FindControl("Image_LogoEmpresa")).ImageUrl = "~\\Pictures\\CompanyPictures\\DefaultCompanyPic.png";
                }

                if (((ListBox)e.Row.FindControl("ListBox_DatosVacanteHabilidades")).Items.Count == 0)
                {
                    ((ListBox)e.Row.FindControl("ListBox_DatosVacanteHabilidades")).Visible = false;
                    ((Label)e.Row.FindControl("Label_DatosVacanteNoHabilidades")).Visible = true;
                }
                if (((ListBox)e.Row.FindControl("ListBox_DatosVacanteEspecialidades")).Items.Count == 0)
                {
                    ((ListBox)e.Row.FindControl("ListBox_DatosVacanteEspecialidades")).Visible = false;
                    ((Label)e.Row.FindControl("Label_DatosVacanteNoPostgrados")).Visible = true;
                }
            }
        }

        protected object EvaluateIfPuestoEqualsNull()
        {
            return (Eval("Puesto") == null) ? "<span class=\"LetraRoja\">No Especificado</span>" : Eval("Puesto");
        }
        protected object ContarAplicacionesActivas()
        {
            return new Vacante(Convert.ToInt32(Eval("ID"))).Aplicaciones.Count(a => a.SiActiva);
        }

        protected void DropDownList_HabilidadesVacanteNueva_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.DropDownList_HabilidadesVacanteNueva.SelectedValue != "0")
            {
                this.Button_AñadirHabilidadVacanteNueva.Enabled = true;
            }
            else
            {
                this.Button_AñadirHabilidadVacanteNueva.Enabled = false;
            }
        }
        protected void DropDownList_PostgradosVacanteNueva_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.DropDownList_PostgradosVacanteNueva.SelectedValue != "0")
            {
                this.Button_AñadirPostgradoVacanteNueva.Enabled = true;
            }
            else
            {
                this.Button_AñadirPostgradoVacanteNueva.Enabled = false;
            }
        }
    }
}
